define(function(require, exports) {
	var pubjs = require('pubjs');
	var $ = require('jquery');
	var util = require('util');
	var view = require('@base/view');

	// 是否是百分比数据
	var percentPattern = /^\d+(\.\d+)?%$/;
	function isPercent(string) {
		return percentPattern.test(String(string))
	}

	// 可嵌套布局模块
	var Base = view.container.extend({
		/**
		 * 单元配置说明，可在items中嵌套使用
		 * @property {Array}          items    指定当前单元下的嵌套单元集合
		 * @property {Number}         padding  items的单元间距
		 * @property {String}         dir      指定items的排列方向 H: 横向，V: 纵向
		 * @property {String}         name     单元名称, 可以省略，省略时不可获取
		 * @property {Number|String}  width    单元宽度，dir为V时默认为100%，dir为H时对于未指定的部分会均分剩余空间
		 * @property {Number|String}  height   单元高度，默认auto
		 * @property {String}         class    单元dom的class
		 * @property {String}         id       单元dom的id
		 * @property {Object}         attr     单元dom的attribute
		 * @property {Object}         css      单元dom的附加样式
		 *
		 * item的缩写说明: name(.class)(#id)(^width)(&height)(*right)
		 *
		 * eg:
		 *  {
		 *		dir: 'H',
		 *		padding: 50,
		 *		items: [
		 *			{
		 *				name: 'left',
		 *				width: 450,
		 *				dir: 'V',
		 *				padding: 30,
		 *				items: [
		 *					'amout(.amount)(#id)(^333.3333%)(&300)',
		 *					'gender',
		 *					'age',
		 *					'career',
		 *					'interest'
		 *				]
		 *			},
		 *			'right'
		 *		]
		 *	}
		 */
		init: function(config) {
			config = pubjs.conf(config, {
				dir: 'H',
				padding: 0,
				items: [
				]
			});

			this.$items = {};

			this.Super('init', arguments);
		},
		afterBuild: function() {
			var el = this.getDOM();
			el.css({'min-width': el.width()});
			this.buildChildren(this.getConfig(), el);
		},
		// 处理item的缩写方式
		formatItem: function(item) {
			if (util.isString(item)) {
				var res = {};
				var cs = item.split(/[\(\)]+/);
				res.name = cs.shift();
				while (cs.length){
					var attr = cs.shift();
					var attrContent = attr.substr(1);
					if (attr){
						switch (attr.charAt(0)){
							case '.': // .开头表示是CSS类
								res.klazz = attrContent;
							break;
							case '#': // #开头表示是ID
								res.id = attrContent;
							break;
							case '^': // ^开头表示width
								res.width = attrContent;
							break;
							case '&': // &开头表示height
								res.height = attrContent;
							break;
							case '*': // *开头表示权限
								res.right= attrContent;
							break;
						}
					}
				}
				return res;
			}

			return item;
		},
		// 构建单元下的子单元
		buildChildren: function(config, container) {
			var items = [];
			var containerWidth = container.width();
			var dir = config.dir.charAt(0).toUpperCase();
			var padding = config.padding;

			if (isPercent(padding)) {
				padding = parseInt(containerWidth * parseFloat(padding) / 100, 10);
			}

			// 预处理单元配置
			switch(dir) {
				// 纵向
				case 'V':
					util.each(config.items, function(item, index) {
						item = this.formatItem(item);
						// 如果有设置检查权限，检查权限是否需要创建
						if (item.right && (item.right !='*') && !pubjs.checkRight(item.right))
						{
							return null;
						}
						var isLast = index + 1 === config.items.length;
						items.push({
							container: container,
							name: item.name,
							width: item.width || '100%',
							height: item.height || 'auto',
							klazz: item.class || '',
							css: {
								'display': 'block',
								'margin-bottom': isLast ? 0 : padding
							},
							origin: item
						});
					}, this);
				break;
				// 横向
				case 'H':
					// 智能单元计算宽度，将未设置宽度的单元提取出来，均分剩余宽度
					var autoWidthItems = [];
					// 已占据宽度，初始为单元padding之和
					var occupiedWidth = (config.items.length - 1) * padding || 0;
					util.each(config.items, function(item) {
						item = this.formatItem(item);
						var width = item.width;
						if (width && width !== 'auto') {
							if (isPercent(width)) {
								width = parseInt(containerWidth * parseFloat(width) / 100, 10);
							}
							occupiedWidth += width;
						} else {
							autoWidthItems.push(item);
						}
					}, this);

					util.each(config.items, function(item, index) {
						item = this.formatItem(item);
						var isLast = index + 1 === config.items.length;
						var width = item.width;

						if (isPercent(width)) {
							width = parseInt(containerWidth * parseFloat(width) / 100, 10);
						}

						if (util.exist(autoWidthItems, item.name, 'name')) {
							// 未设置宽度的均分宽度
							width = parseInt((containerWidth - occupiedWidth) / autoWidthItems.length, 10);
							// 最后一个占据剩余宽度
							if (isLast) {
								width = containerWidth - occupiedWidth;
							}
							util.remove(autoWidthItems, item.name, 'name')
							occupiedWidth += width;
						}
						items.push({
							container: container,
							name: item.name,
							width: width,
							height: item.height || 'auto',
							klazz: item.class || '',
							css: {
								'display': 'inline-block',
								'vertical-align': 'top',
								'margin-right': isLast ? 0 : padding
							},
							origin: item
						});
					}, this);
				break;
			}

			util.each(items, this.buildItem, this);

			return this;
		},
		buildItem: function(item) {
		if (item.name && (item.name in this.$items)) {
				pubjs.log('nestLayout module ' + this._.name + ' item.name [' + item.name + '] is exist, rename to [copy_' + item.name + ']');
			}
			var elm = $('<div></div>').appendTo(item.container)
				.width(item.width)
				.height(item.height)
				.css(util.extend(item.css,item.origin.css))
				.addClass(item.klazz)
				.attr(
					util.extend({
						'nest-layout-name': item.name
					},item.origin.attr)
				).prop('id', item.origin.id);

			if (item.name) {
				this.$items[item.name] = elm;
			}
			if (item.origin.items) {
				this.buildChildren(item.origin, elm);
			}
			return this;
		},
		getContainer: function(name) {
			return this.$items[name];
		}
	});
	exports.base = Base;
});